package com.justnow;

import java.util.ArrayList;
import java.util.List;

public class Solution54 {

    /**
     * 参考链接：
     * https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-liao-tian-yi-jian/
     * @param matrix
     * @return
     */
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();

        if (matrix == null || matrix.length == 0)
            return list;

        int rows = matrix.length; //行数
        int cols = matrix[0].length; //列数
        int i = 0; //i表示第几层

        //统计矩阵从外向内的层数，如果矩阵非空，那么它的层数至少为1层。这里的层数指的是一次顺时针循环打印出的数字
        int count = (Math.min(rows, cols) + 1) / 2; //

        //从外部向内部遍历，逐层打印数据
        while (i < count) {
            //左上角,从左到右打印，开始的坐标为(i, i)，结束的坐标为(i, cols-1-i)
            for (int j = i; j < cols - i; j++) {
                list.add(matrix[i][j]);
            }

            //右上角，从上往下打印，开始的坐标为(i+1, cols-1-i)，结束的坐标为(rows-1-i, cols-1-i)
            for (int j = i+1; j < rows - i; j++) {
                list.add(matrix[j][cols-1-i]);
            }

            //右下角，从右到左打印，开始的坐标为(rows-1-i, cols-1-(i+1))，结束的坐标为(rows-1-i, i)
            //
            //从右往左，如果这一层只有1行，那么第一个循环已经将该行打印了，这里就不需要打印了，即
            //rows-1-i!=i
            for (int j = (cols-1)-(i+1); j >= i && (rows-1-i != i); j--) {
                list.add(matrix[rows-1-i][j]);
            }

            //右上角，从上到下打印，开始的坐标为(rows-1-i-1, i),结束的坐标为(i+1, i)
            //从下往上，如果这一层只有1列，那么第2个循环已经将该列打印了，这里不需要打印，即
            //
            for (int j = rows-1-i-1; j >= i+1 && (cols-1-i!=i);j--) {
                list.add(matrix[j][i]);
            }

            i++;
        }
        return list;
    }
}
